package com.cskaoyan.javase.oop3._3inner._1member._0introduction;

/**
 * 成员内部类是最普通的内部类，它定义在另一个类的成员位置， 可以看成该类的一个成员.
 * 语法:
 * //外围类
 * [访问权限修饰符] class EnclosedClazz{
 * //成员内部类
 * 	[访问权限修饰符] class InnerClazz{
 *  }
 * }
 *
 * 主要从以下几个角度分析：
 * 1. 访问权限修饰符
 * 类的成员有四种访问权限,成员内部类也有四种.
 * 2. 成员特点
 * 在具体说明成员内部类的特点之前,我们要先理解两个点:
 *      1.为什么说成员内部类可以看成外围类的(普通)成员呢?
 *      不创建对象无法访问该类成员
 *      所以,要想创建成员内部类对象,必须先创建外围类对象.在外围类对象的基础上,才能得到一个成员内部类对象
 *      -->
 *      为什么是这样?
 *      这是因为编译器会在编译成员内部类代码时,"偷偷"把外围类的引用,作为成员内部类的成员变量.也就是说成员内部类对象,必然持有外围类对象的引用.
 *      -->
 *      a.要想创建成员内部类对象,必须先创建外围类对象
 *      b.只要是成员内部类对象,就可以去随时访问外围类成员.
 *
 *      2.类加载.内部类虽然比较特殊,但创建对象仍然要类加载.而且成员内部类的类加载,一定要先类加载外围类.这就会导致,成员内部类当中没有static声明.
 *
 * 成员内部类的成员特点是:
 *      没有static声明相关的内容,其余和正常类一模一样.
 *
 * 3. 继承和实现
 * 仅做了解.
 * 成员内部类可以继承和实现外部的类和接口
 * 而且还可以定义内部类和内部接口去继承和实现
 *
 * 思考:
 *    请思考成员内部类在权限允许的情况下,能不能被一个外部类继承呢?
 *    实际上是可以的,但他的语法很特殊,而且很不常见.感兴趣的可以学习查阅一下
 *
 * @since 16:38
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
}

// 外围类
class EnclosedClazz {
    // 定义成员内部类
    class InnerClazz extends A implements IA{
        int a;
        private int b = 20;
        // Inner classes cannot have static declarations
        // static int c = 30;
        // static {}
        // 可以有全局常量
        static final int C = 30;
        static final String D = "123";
        // static final String E = new String("123");

        public void test() {

        }

        // public static void test2() {
        //
        // }

        {

        }
        public InnerClazz(int a, int b) {
            this.a = a;
            this.b = b;
        }

        public InnerClazz() {
        }
    }
    class A{}
    interface  IA{}
}

// class Test extends EnclosedClazz.InnerClazz {
//
// }